package com.yanxiuhair.system.service.impl;

import java.io.Serializable;
import java.util.Date;
import java.util.Deque;
import java.util.List;
import org.apache.shiro.cache.Cache;
import org.apache.shiro.cache.ehcache.EhCacheManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.yanxiuhair.common.constant.ShiroConstants;
import com.yanxiuhair.common.utils.DateUtils;
import com.yanxiuhair.common.utils.StringUtils;
import com.yanxiuhair.system.domain.SysUserOnline;
import com.yanxiuhair.system.mapper.SysUserOnlineMapper;
import com.yanxiuhair.system.service.ISysUserOnlineService;

/**
 * @ClassName:  SysUserOnlineServiceImpl   
 * @Description: 在线用户 服务层处理   
 * @author: gaoxiaochuang   
 * @date:   2021年7月1日 下午5:22:30   
 *     
 * @Copyright: 2021 http://www.yanxiuhair.com/ Inc. All rights reserved. 
 * 注意：本内容仅限于许昌妍秀发制品有限公司内部传阅，禁止外泄以及用于其他的商业目
 */
@Service
public class SysUserOnlineServiceImpl implements ISysUserOnlineService {
	@Autowired
	private SysUserOnlineMapper userOnlineDao;

	@Autowired
	private EhCacheManager ehCacheManager;

	/**
	 * 通过会话序号查询信息
	 * 
	 * @param sessionId
	 *            会话ID
	 * @return 在线用户信息
	 */
	@Override
	public SysUserOnline selectOnlineById(String sessionId) {
		return userOnlineDao.selectOnlineById(sessionId);
	}

	/**
	 * 通过会话序号删除信息
	 * 
	 * @param sessionId
	 *            会话ID
	 * @return 在线用户信息
	 */
	@Override
	public void deleteOnlineById(String sessionId) {
		SysUserOnline userOnline = selectOnlineById(sessionId);
		if (StringUtils.isNotNull(userOnline)) {
			userOnlineDao.deleteOnlineById(sessionId);
		}
	}

	/**
	 * 通过会话序号删除信息
	 * 
	 * @param sessions
	 *            会话ID集合
	 * @return 在线用户信息
	 */
	@Override
	public void batchDeleteOnline(List<String> sessions) {
		for (String sessionId : sessions) {
			SysUserOnline userOnline = selectOnlineById(sessionId);
			if (StringUtils.isNotNull(userOnline)) {
				userOnlineDao.deleteOnlineById(sessionId);
			}
		}
	}

	/**
	 * 保存会话信息
	 * 
	 * @param online
	 *            会话信息
	 */
	@Override
	public void saveOnline(SysUserOnline online) {
		userOnlineDao.saveOnline(online);
	}

	/**
	 * 查询会话集合
	 * 
	 * @param userOnline
	 *            在线用户
	 */
	@Override
	public List<SysUserOnline> selectUserOnlineList(SysUserOnline userOnline) {
		return userOnlineDao.selectUserOnlineList(userOnline);
	}

	/**
	 * 强退用户
	 * 
	 * @param sessionId
	 *            会话ID
	 */
	@Override
	public void forceLogout(String sessionId) {
		userOnlineDao.deleteOnlineById(sessionId);
	}

	/**
	 * 清理用户缓存
	 * 
	 * @param loginName
	 *            登录名称
	 * @param sessionId
	 *            会话ID
	 */
	@Override
	public void removeUserCache(String loginName, String sessionId) {
		Cache<String, Deque<Serializable>> cache = ehCacheManager.getCache(ShiroConstants.SYS_USERCACHE);
		Deque<Serializable> deque = cache.get(loginName);
		if (StringUtils.isEmpty(deque) || deque.size() == 0) {
			return;
		}
		deque.remove(sessionId);
	}

	/**
	 * 查询会话集合
	 * 
	 * @param expiredDate
	 *            失效日期
	 */
	@Override
	public List<SysUserOnline> selectOnlineByExpired(Date expiredDate) {
		String lastAccessTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, expiredDate);
		return userOnlineDao.selectOnlineByExpired(lastAccessTime);
	}
}
